// 历史记录相关变量
let chatHistory = [];
let historyIndex = -1;
let currentInput = ''; // 保存用户当前输入的内容

function initializeWhenReady() {
    if (document.getElementById('queryInput') && document.getElementById('sendButton')) {
      initializeEventListeners();
      loadHistory(); // 加载历史记录
    } else {
      setTimeout(initializeWhenReady, 100);
    }
}
function sendQuery(query) {
    // 尝试从 localStorage 获取现有的 chatId，如果没有则生成一个新的
    let chatId = localStorage.getItem('currentChatId');
    if (!chatId) {
        chatId = 'chat_' + Date.now() + '_' + Math.floor(Math.random() * 10000);
        // 保存 chatId 供后续会话使用
        localStorage.setItem('currentChatId', chatId);
    }

    // 构造SSE URL，将query和chatId作为查询参数
    const url = 'http://localhost:8080/api/assistant/chat?userMessage='
    + encodeURIComponent(query) + '&chatId=' + encodeURIComponent(chatId)+
    '&Authorization=boot.admin.c4ca4238a0b923820dcc509a6f75849b.2c3ba7018f0c4f0c8af8bc0b9bc4febc';

    // 创建EventSource连接
    const eventSource = new EventSource(url);

    // 用于累积从服务器接收到的消息
    let accumulatedResponse = '';

    // 监听消息事件
    eventSource.onmessage = function(event) {
        try {
            if(event.data.startsWith('end|')){
                eventSource.close();
                window.amisScoped.getComponentById("content").props.dispatchEvent("change", { content: accumulatedResponse });
            }else{
                accumulatedResponse += event.data;
                handleResponse(accumulatedResponse);
            }
        } catch (e) {
            console.error('Error parsing SSE data:', e);
        }
    };

    // 监听连接打开事件
    eventSource.onopen = function(event) {
        console.log('SSE connection opened');
    };

    // 监听错误事件
    eventSource.onerror = function(event) {
        console.error('SSE error occurred:', event);
        eventSource.close();

        handleResponse({
            "type": "page",
            "body": [
                {
                    "type": "alert",
                    "level": "danger",
                    "title": "错误",
                    "body": "与聊天服务器的连接出现错误"
                }
            ]
        });
    };
}

// 添加一个新函数用于开始新的对话
function startNewChat() {
    // 清除当前的 chatId，下次会话时会生成新的
    localStorage.removeItem('currentChatId');
    // 可以在这里添加其他清理逻辑，比如清空聊天界面等
    console.log('已开始新的对话');
}

// 保存查询到历史记录（去重）
function saveToHistory(query) {
    // 从 localStorage 获取历史记录
    let history = JSON.parse(localStorage.getItem('chatHistory') || '[]');

    // 检查是否已存在相同内容，如果存在则移除旧记录
    const existingIndex = history.indexOf(query);
    if (existingIndex !== -1) {
        history.splice(existingIndex, 1);
    }

    // 添加新查询到历史记录开头
    history.unshift(query);

    // 限制历史记录数量为 50 条
    if (history.length > 50) {
        history = history.slice(0, 50);
    }

    // 保存到 localStorage
    localStorage.setItem('chatHistory', JSON.stringify(history));

    // 更新全局变量
    chatHistory = history;
    historyIndex = -1;

    // 更新历史记录显示
    displayHistory();
}

// 清除历史记录
function clearHistory() {
    // 清空 localStorage 中的历史记录
    localStorage.removeItem('chatHistory');

    // 更新全局变量
    chatHistory = [];
    historyIndex = -1;

    // 更新历史记录显示
    displayHistory();
}

// 获取历史记录
function getHistory() {
    if (chatHistory.length === 0) {
        chatHistory = JSON.parse(localStorage.getItem('chatHistory') || '[]');
    }
    return chatHistory;
}

// 获取历史记录中的上一条
function getPreviousHistory() {
    const history = getHistory();
    if (history.length === 0) return null;

    if (historyIndex < history.length - 1) {
        historyIndex++;
        return history[historyIndex];
    }
    return history[history.length - 1];
}

// 获取历史记录中的下一条
function getNextHistory() {
    const history = getHistory();
    if (history.length === 0) return null;

    if (historyIndex > 0) {
        historyIndex--;
        return history[historyIndex];
    } else if (historyIndex === 0) {
        historyIndex = -1;
        return currentInput; // 返回用户正在输入的内容
    }
    return null;
}

// 显示历史记录
function displayHistory() {
    const historyList = document.getElementById('historyList');
    const clearHistoryBtn = document.getElementById('clearHistoryBtn');
    if (!historyList) return;

    // 添加清除历史记录按钮的事件监听器
    if (clearHistoryBtn) {
        clearHistoryBtn.addEventListener('click', function() {
            if (confirm('确定要清除所有历史记录吗？')) {
                clearHistory();
            }
        });
    }

    const history = getHistory();
    if (history.length === 0) {
        historyList.innerHTML = '<div class="history-item"><div class="history-content">暂无历史记录</div></div>';
        return;
    }

    // 清空当前列表
    historyList.innerHTML = '';

    // 添加历史记录项
    history.forEach((item, index) => {
        const historyItem = document.createElement('div');
        historyItem.className = 'history-item';

        const indexElement = document.createElement('div');
        indexElement.className = 'history-index';
        indexElement.innerText = (index + 1) + '.';

        const contentElement = document.createElement('div');
        contentElement.className = 'history-content';
        contentElement.innerText = item.length > 50 ? item.substring(0, 50) + '...' : item;
        contentElement.title = item; // 完整内容作为提示

        historyItem.appendChild(indexElement);
        historyItem.appendChild(contentElement);

        historyItem.addEventListener('click', () => {
            const inputDiv = document.getElementById('queryInput');
            if (inputDiv) {
                inputDiv.innerText = item;
                // 将光标移到末尾
                const range = document.createRange();
                range.selectNodeContents(inputDiv);
                range.collapse(false);
                const selection = window.getSelection();
                selection.removeAllRanges();
                selection.addRange(range);
            }
        });

        historyList.appendChild(historyItem);
    });
}

// 加载历史记录
function loadHistory() {
    getHistory();
    displayHistory();
}

function handleResponse(value) {
    window.amisScoped.doAction([{
        "componentId": "content",
        "actionType": "setValue",
        "args": {
            "value": value
        }
    }]);
}

// 初始化事件监听器
function initializeEventListeners() {
    // 获取div和button元素
    const inputDiv = document.getElementById('queryInput');
    const sendButton = document.getElementById('sendButton');

    if (inputDiv && sendButton) {
        // 添加div的键盘事件监听
        inputDiv.addEventListener('keydown', function(event) {
            const value = inputDiv.innerText.trim();

            // 处理 Shift+Enter 换行
            if (event.key === 'Enter' && event.shiftKey) {
                // 允许换行，不阻止默认事件
                return;
            }

            // 处理 Enter 发送（不带 Shift）
            if (event.key === 'Enter' && !event.shiftKey) {
                event.preventDefault();
                if (value) {
                    sendQuery(value);
                    // 保存到历史记录
                    saveToHistory(value);
                    // 清空输入框
                    inputDiv.innerText = '';
                    // 重置历史记录索引
                    historyIndex = -1;
                    currentInput = '';
                }
                return false;
            }

            // 处理向上箭头键（历史记录）
            if (event.key === 'ArrowUp') {
                // 只有在光标位于第一行开头时才触发历史记录
                if (window.getSelection().rangeCount > 0) {
                    const range = window.getSelection().getRangeAt(0);
                    const preCaretRange = range.cloneRange();
                    preCaretRange.selectNodeContents(inputDiv);
                    preCaretRange.setEnd(range.endContainer, range.endOffset);
                    const caretPos = preCaretRange.toString().length;

                    if (caretPos === 0) {
                        event.preventDefault();
                        // 保存当前用户输入
                        if (historyIndex === -1) {
                            currentInput = value;
                        }
                        const previous = getPreviousHistory();
                        if (previous !== null) {
                            inputDiv.innerText = previous;
                            // 将光标移到末尾
                            const range = document.createRange();
                            range.selectNodeContents(inputDiv);
                            range.collapse(false);
                            const selection = window.getSelection();
                            selection.removeAllRanges();
                            selection.addRange(range);
                        }
                    }
                }
            }

            // 处理向下箭头键（历史记录）
            if (event.key === 'ArrowDown') {
                // 只有在光标位于最后一行末尾时才触发历史记录
                if (window.getSelection().rangeCount > 0) {
                    const range = window.getSelection().getRangeAt(0);
                    const preCaretRange = range.cloneRange();
                    preCaretRange.selectNodeContents(inputDiv);
                    preCaretRange.setEnd(range.endContainer, range.endOffset);
                    const caretPos = preCaretRange.toString().length;

                    if (caretPos === inputDiv.innerText.length) {
                        event.preventDefault();
                        const next = getNextHistory();
                        if (next !== null) {
                            inputDiv.innerText = next;
                            // 将光标移到末尾
                            const range = document.createRange();
                            range.selectNodeContents(inputDiv);
                            range.collapse(false);
                            const selection = window.getSelection();
                            selection.removeAllRanges();
                            selection.addRange(range);
                        }
                    }
                }
            }
        });

        // 添加发送按钮的点击事件监听
        sendButton.addEventListener('click', function() {
            const value = inputDiv.innerText.trim();
            if (value) {
                sendQuery(value);
                saveToHistory(value);
                inputDiv.innerText = '';
                // 重置历史记录索引
                historyIndex = -1;
                currentInput = '';
            }
        });
    }
}
